#!/bin/sh

# Authors:
# - Moritz Warning <moritzwarning@web.de> (2016)
# - Zhong Jianxin <azuwis@gmail.com> (2014)
#
# See file LICENSE at the project root directory for license information.
#
# i3status.conf should contain:
# general {
#   output_format = i3bar
# }
#
# i3 config looks like this:
# bar {
#   status_command exec /usr/share/doc/i3status/contrib/net-speed.sh
# }
#
# Single interface:
# ifaces="eth0"
#
# Multiple interfaces:
# ifaces="eth0 wlan0"
#

# Auto detect interfaces
ifaces=$(ls /sys/class/net | grep -E '^(eno|enp|ens|enx|eth|wlan|wlp)')

last_time=0
last_rx=0
last_tx=0
rate=""

readable() {
	local bytes=$1
	local kib=$((bytes >> 10))
	if [ $kib -lt 0 ]; then
		echo "? K"
	elif [ $kib -gt 1024 ]; then
		local mib_int=$((kib >> 10))
		local mib_dec=$((kib % 1024 * 976 / 10000))
		if [ "$mib_dec" -lt 10 ]; then
			mib_dec="0${mib_dec}"
		fi
		echo "${mib_int}.${mib_dec} M"
	else
		echo "${kib} K"
	fi
}

update_rate() {
	local time=$(date +%s)
	local rx=0 tx=0 tmp_rx tmp_tx

	for iface in $ifaces; do
		read tmp_rx <"/sys/class/net/${iface}/statistics/rx_bytes"
		read tmp_tx <"/sys/class/net/${iface}/statistics/tx_bytes"
		rx=$((rx + tmp_rx))
		tx=$((tx + tmp_tx))
	done

	local interval=$(($time - $last_time))
	if [ $interval -gt 0 ]; then
		printf '{"text":" %-4s  %-4s"}\n' "$(readable $(((rx - last_rx) / interval)))" "$(readable $(((tx - last_tx) / interval)))"
	else
		printf ""
	fi

	last_time=$time
	last_rx=$rx
	last_tx=$tx
}

while :; do
	sleep 1
	update_rate
	# printf "%-10s %-20s"
done
